// 包repository实现与数据库的直接交互（DAO层）
package repository

import (
	"errors"

	"gitee.com/ysl729895/go-mall/internal/model"
	"gorm.io/gorm"
)

// ProductRepository 定义商品数据操作接口
//go:generate mockgen -source=product_repo.go -destination=mock_product_repo.go -package=repository

type ProductRepository interface {
	GetDB() *gorm.DB
	GetByID(id uint) (*model.Product, error)
}

type productRepository struct {
	db *gorm.DB
}

// NewProductRepository 构造函数
func NewProductRepository(db *gorm.DB) ProductRepository {
	return &productRepository{db: db}
}

// ErrProductNotFound 商品未找到错误
var ErrProductNotFound = errors.New("商品未找到")

// GetDB 获取底层 gorm.DB，便于事务
func (r *productRepository) GetDB() *gorm.DB {
	return r.db
}

// GetByID 根据ID查找商品
func (r *productRepository) GetByID(id uint) (*model.Product, error) {
	var product model.Product
	err := r.db.Preload("Category").First(&product, id).Error
	if errors.Is(err, gorm.ErrRecordNotFound) {
		return nil, ErrProductNotFound
	}
	return &product, err
}
